#include "Game.h"
#include "interfazGrafica.h"
#include "Event.h"

#include <CEGUISystem.h>
#include <RendererModules/OpenGL/CEGUIOpenGLRenderer.h>
#include <CEGUIWindowManager.h>
#include <CEGUI.h>
#include <iostream>
#include <CEGUIUDim.h>

using namespace std;


interfazGrafica::interfazGrafica(void):renderer(CEGUI::OpenGLRenderer::create())
	{
		CEGUI::System::create(renderer);
		try{
			inicializarCEGUI();
		}catch(const std::exception& e){
				cout << e.what() << endl;
		}
		try{
			construirInterfaz();
		}catch(const std::exception& e){
			cout << e.what() << endl;
		}


		//los eventos a los que va a escuchar
		g->getEventos()->addListener(TECLA_PULSADA,this);
		g->getEventos()->addListener(TECLA_SOLTADA,this);
		g->getEventos()->addListener(RATON_BOTON_PULSADO,this);
		g->getEventos()->addListener(RATON_BOTON_SOLTADO,this);
		g->getEventos()->addListener(RATON_MOVIDO,this);
		g->getEventos()->addListener(RESOLUCION_CAMBIADA,this);
		g->getEventos()->addListener(CARGANDO_MAPA,this);
	}

//inyeccion de eventos.
bool interfazGrafica::onEvent( Event *e )
	{

	eventoMovimientoRaton	*dataMovimiento		= NULL;
	eventoPulsacionRaton	*dataPulsacionRaton = NULL;
	eventoTeclado			*dataTeclado		= NULL;

	CEGUI::System &sistema = CEGUI::System::getSingleton();

	switch(e->tipo){
		case TECLA_PULSADA:
			dataTeclado = (eventoTeclado *)e->datos;
			return sistema.injectKeyDown(dataTeclado->tecla);
		break;
		case TECLA_SOLTADA:
			dataTeclado = (eventoTeclado *)e->datos;
			return sistema.injectKeyUp(dataTeclado->tecla);
		break;
		case RATON_BOTON_PULSADO:
			dataPulsacionRaton = (eventoPulsacionRaton *)e->datos;
			sistema.injectMouseButtonDown((CEGUI::MouseButton)dataPulsacionRaton->boton);
		break;
		case RATON_BOTON_SOLTADO:
			dataPulsacionRaton = (eventoPulsacionRaton *)e->datos;
			sistema.injectMouseButtonUp((CEGUI::MouseButton)dataPulsacionRaton->boton);
		break;
		case RATON_MOVIDO:
			dataMovimiento = (eventoMovimientoRaton*)e->datos;
			return CEGUI::System::getSingleton().injectMousePosition(dataMovimiento->x,dataMovimiento->y);
		break;
		case RESOLUCION_CAMBIADA:
			
		break;
		case CARGANDO_MAPA:
			panelQuest->setVisible(false);
		break;


	}
		return false;
	}


void interfazGrafica::render()
	{
		CEGUI::System::getSingleton().injectTimePulse(((float)g->getFPS()->getElapsedTime())/1000.f);
		CEGUI::System::getSingleton().renderGUI();
	}
void interfazGrafica::construirInterfaz(){


/*
		CEGUI::WindowManager& manager = CEGUI:: WindowManager::getSingleton();
		root = manager.createWindow("DefaultWindow", "root");
		CEGUI::System::getSingleton().setGUISheet(root);*/


		//Window* layout = manager.loadWindowLayout("WidgetGalore.layout");
		//root->addChildWindow(layout);
		/*
		CEGUI::FrameWindow *fw = (CEGUI::FrameWindow*)manager.createWindow("TaharezLook/FrameWindow","testWindow");
		fw->setHeight(CEGUI::UDim(0.2f,0.f));
		fw->setWidth(CEGUI::UDim(1.f,0.f));
		fw->setYPosition(CEGUI::UDim(0.8f,0.f));
		fw->setText("Habilidades");
		fw->setDragMovingEnabled(false);

		CEGUI::PushButton *boton = new CEGUI::PushButton("TaharezLook/Button","testBoton");
		boton->setText("boton lalala");
		fw->addChildWindow(boton);

		root->addChildWindow(fw);
		*/

		CEGUI::WindowManager& manager = CEGUI:: WindowManager::getSingleton();
		root = manager.loadWindowLayout("miLayout.layout");
		CEGUI::System::getSingleton().setGUISheet(root);

		panelQuest = static_cast<CEGUI::Window*>(manager.getWindow("ventanaMision"));
		textoQuest = static_cast<CEGUI::Window*>(manager.getWindow("textoMision"));
		CEGUI::PushButton *botonAceptar = static_cast<CEGUI::PushButton*>(manager.getWindow("botonAceptar"));
		CEGUI::PushButton *botonCancelar = static_cast<CEGUI::PushButton*>(manager.getWindow("botonCancelar"));

		botonAceptar->subscribeEvent(CEGUI::PushButton::EventActivated,CEGUI::Event::Subscriber(&interfazGrafica::controlarEventoQuest, this));
		botonCancelar->subscribeEvent(CEGUI::PushButton::EventActivated,CEGUI::Event::Subscriber(&interfazGrafica::controlarEventoQuest, this));
		

	}

void interfazGrafica::inicializarCEGUI()
	{
		CEGUI::DefaultResourceProvider* rp = static_cast<CEGUI::DefaultResourceProvider*>(
									CEGUI::System::getSingleton().getResourceProvider());

		rp->setResourceGroupDirectory("schemes", "data/GUI/schemes/");
		rp->setResourceGroupDirectory("imagesets", "data/GUI/imagesets/");
		rp->setResourceGroupDirectory("fonts", "data/GUI/fonts/");
		rp->setResourceGroupDirectory("layouts", "data/GUI/layouts/");
		rp->setResourceGroupDirectory("looknfeels", "data/GUI/looknfeel/");
		rp->setResourceGroupDirectory("lua_scripts", "data/GUI/lua_scripts/");

		CEGUI::Imageset::setDefaultResourceGroup("imagesets");
		CEGUI::Font::setDefaultResourceGroup("fonts");
		CEGUI::Scheme::setDefaultResourceGroup("schemes");
		CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
		CEGUI::WindowManager::setDefaultResourceGroup("layouts");
		CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");

		CEGUI::SchemeManager::getSingleton().create( "TaharezLook.scheme" );
		CEGUI::FontManager::getSingleton().create( "DejaVuSans-10.font" );
	}

interfazGrafica::~interfazGrafica(void)
	{

	}

bool interfazGrafica::controlarEventoQuest( const CEGUI::EventArgs& args )
	{
		const CEGUI::MouseEventArgs& dataEvento = static_cast<const CEGUI::MouseEventArgs&>(args);

		CEGUI::String source = dataEvento.window->getName();

		if (source == "botonAceptar")
			g->getEventos()->enviarEvento(new Event(QUEST_ACEPTADA,new eventoQuestAceptada(actual)));

		panelQuest->setVisible(false);

		return true;
	}

void interfazGrafica::cambiaResolucion(bool primeraParte)
	{
		if (primeraParte){
			renderer.grabTextures();
		}else{
			renderer.restoreTextures();
			
			//renderer.setDisplaySize(CEGUI::Size(g->getAnchoPantalla(),g->getAltoPantalla()));
			CEGUI::System::getSingleton().notifyDisplaySizeChanged(CEGUI::Size(g->getAnchoPantalla(),g->getAltoPantalla()));
		}
	}

void interfazGrafica::mostrarQuest( Quest *q )
	{
		actual = q;
		panelQuest->setText(q->getNombre());
		textoQuest->setText(q->getTexto());
		panelQuest->setVisible(true);

	}